package fr.utt.millebornes.cartes;
import fr.utt.millebornes.exception.AvancementImpossibleAttaqueException;
import fr.utt.millebornes.exception.AvancementImpossibleEtape200Exception;
import fr.utt.millebornes.exception.AvancementImpossibleFeuVertException;
import fr.utt.millebornes.exception.AvancementImpossibleKilometresException;
import fr.utt.millebornes.exception.AvancementImpossibleRalentissementException;
import fr.utt.millebornes.exception.BotteException;
import fr.utt.millebornes.exception.CibleIncorrecteException;
import fr.utt.millebornes.exception.CibleSuicideException;
import fr.utt.millebornes.exception.CoupFourreException;
import fr.utt.millebornes.exception.DejaAttaqueException;
import fr.utt.millebornes.exception.DejaRalentiException;
import fr.utt.millebornes.exception.ImmuniseException;
import fr.utt.millebornes.exception.JoueurDebutantNonAttaquableException;
import fr.utt.millebornes.exception.MauvaiseParadeException;
import fr.utt.millebornes.exception.NonAttaqueException;
import fr.utt.millebornes.exception.NonRalentiException;
import fr.utt.millebornes.joueur.Joueur;


public abstract class Carte {

	protected int type;
	protected String representationVisuelle;
	protected int pileDestination;
	
	public final static int TYPE_ETAPE_25=101;
	public final static int TYPE_ETAPE_50=102;
	public final static int TYPE_ETAPE_75=103;
	public final static int TYPE_ETAPE_100=104;
	public final static int TYPE_ETAPE_200=105;
	public final static int TYPE_FEU_ROUGE=201;
	public final static int TYPE_LIMITATION_VITESSE=202;
	public final static int TYPE_PANNE_ESSENCE=203;
	public final static int TYPE_CREVAISON=204;
	public final static int TYPE_ACCIDENT=205;
	public final static int TYPE_FEU_VERT=301;
	public final static int TYPE_FIN_LIMITATION_VITESSE=302;
	public final static int TYPE_FIN_PANNE_ESSENCE=303;
	public final static int TYPE_FIN_CREVAISON=304;
	public final static int TYPE_FIN_ACCIDENT=305;
	public final static int TYPE_BOTTE_PRIORITAIRE=401;
	public final static int TYPE_BOTTE_CITERNE=403;
	public final static int TYPE_BOTTE_INCREVABLE=404;
	public final static int TYPE_BOTTE_AS_DU_VOLANT=405;
	
	public int getType() {
		return type;
	}
	
	public boolean isCarteAttaque() {
		return false;
	}
	
	public boolean isCarteDefensive() {
		return false;
	}
	
	public boolean isCarteEtape() {
		return false;
	}
	
	public boolean isCarteParade() {
		return false;
	}
	
	public boolean isCarteBotte() {
		return false;
	}
	public int getDestination() {
		return pileDestination;
	}
	
	public boolean jouer(Joueur jsource, Joueur jcible) throws CoupFourreException,DejaAttaqueException, ImmuniseException, JoueurDebutantNonAttaquableException, DejaRalentiException,CibleSuicideException,AvancementImpossibleRalentissementException,AvancementImpossibleEtape200Exception, NonAttaqueException, MauvaiseParadeException, NonRalentiException, AvancementImpossibleAttaqueException, AvancementImpossibleFeuVertException, AvancementImpossibleKilometresException, BotteException, CibleIncorrecteException {
		if (this.peutEtrePosee(jcible)) {
			jsource.supprimerCarteDeLaMain(this);
			jcible.poser(this);
			effetDeJeu(jsource,jcible);
			return true;
		}
		return false;
	}
	
	protected abstract void effetDeJeu(Joueur jsource,Joueur jcible) throws CoupFourreException, BotteException;
	
	public abstract boolean peutEtrePosee(Joueur jcible) throws AvancementImpossibleAttaqueException, AvancementImpossibleFeuVertException, AvancementImpossibleKilometresException, AvancementImpossibleRalentissementException, AvancementImpossibleEtape200Exception, NonAttaqueException, MauvaiseParadeException, NonRalentiException, DejaAttaqueException, ImmuniseException, JoueurDebutantNonAttaquableException, DejaRalentiException ;
//	public abstract boolean jouer(Joueur jsource, Joueur jcible);
	
}
